#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>

void Worker(int cnt)
{
     printf("i am child, pid: %d, cnt: %d\n", getpid(), cnt);
     sleep(1);
}

int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        // 子进程
        int cnt = 5;
        while(cnt)
        {
            Worker(cnt);
            sleep(1);
            cnt--;
        }
        exit(1);
    }
    // 父进程
    while(1)
    {
        int status = 0;
        pid_t rid = waitpid(id, &status, WNOHANG);
        if(rid > 0)
        {
            // 等待成功
            printf("wait success, child quit, exit code: %d, exit sig: %d\n", (status>>8)&0xff, status&0x7f);
            break;
        }
        else if(rid == 0)
        {
            // 等待成功，但子进程并未退出
            printf("wait again, child alive, do other thing\n");
            sleep(1);
        }
        else{
            // 等待失败
            printf("wait failed\n");
            break;
        }

    }

    return 0;
}
// stastus
//void Worker(int number)
//{
//    int cnt = 5;
//    while(cnt)
//    {
//        printf("i am child, pid: %d, ppid: %d, cnt: %d, number: %d\n", getpid(), getppid(), cnt--, number);
//        sleep(1);
//    }
//}
//
//const int n = 10;
//
//int main()
//{
//    for(int i = 0; i < n; i++)
//    {
//        pid_t id = fork();
//        if(id == 0)
//        {
//            Worker(i);
//            //status = i;
//            exit(i);
//        }
//    }
//
//    // 等待多个子进程
//    for(int i = 0; i < n; i++)
//    {
//        int status = 0;
//        pid_t rid = waitpid(-1, &status, 0); //pid > 0, -1:等待任意一个进程
//        if(rid > 0)
//        {
//            printf("wait child %d success, exit code: %d\n", rid, WEXITSTATUS(status));
//        }
//    }
//    return 0;
//}

//int main()
//{ 
//    pid_t id = fork();
//
//    if(id == 0)
//    {
//
//        // child
//        Worker();
//        exit(1);
//    }
//    else{
//        // sleep(10);
//        // father
//        printf("wait before:\n");
//        //pid_t rid = wait(NULL);
//        int status = 0;
//        pid_t rid = waitpid(id, &status, 0);
//        printf("wait after:\n");
//        if(rid == id)
//        {
//            // 不能对status整体使用
//            //printf("wait success, pid: %d, rpid: %d, exit sig: %d, exit code: %d\n",getpid(), rid, status&0x7f, (status>>8)&0xff);
//            if(WIFEXITED(status))
//            {
//                printf("child process normal quit, exit code: %d\n", WEXITSTATUS(status));
//            }
//            else{
//                printf("child process quit exept!!!\n");
//            }
//        }
//    }
//    return 0;
//}
